﻿#region License
// Copyright (c) Dmitry Antonenko (http://hystrix.com.ua)
// 
// Licensed under the Apache License, Version 2.0 (the "License"); 
// you may not use this file except in compliance with the License. 
// You may obtain a copy of the License at 
// 
// http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software 
// distributed under the License is distributed on an "AS IS" BASIS, 
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
// See the License for the specific language governing permissions and 
// limitations under the License.
// 
// The latest version of this file can be found at http://fluentfilters.codeplex.com/
#endregion

namespace FluentFilters
{
    using System.Web.Mvc;

    public class FluentFiltersActionInvoker : ControllerActionInvoker
    {
        #region Fields

        private readonly IFilterRegistry _registry;

        #endregion

        #region Constructor

        public FluentFiltersActionInvoker(IFilterRegistry registry)
        {
            _registry = registry;
        }

        #endregion

        #region Overridden methods

        /// <summary>
        /// Retrieves information about the action filters
        /// </summary>
        /// <param name="controllerContext">The controller context</param>
        /// <param name="actionDescriptor">The action descriptor</param>
        /// <returns>Information about the action filters</returns>
        protected override FilterInfo GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
        {
            FilterInfo filters = base.GetFilters(controllerContext, actionDescriptor);

            FilterInfo registeredFilters = _registry.GetFilters(new FilterRegistryContext(controllerContext, actionDescriptor));

            foreach (IActionFilter actionFilter in registeredFilters.ActionFilters)
                filters.ActionFilters.Add(actionFilter);
                
            foreach (IAuthorizationFilter authorizationFilter in registeredFilters.AuthorizationFilters)
                filters.AuthorizationFilters.Add(authorizationFilter);
                
            foreach (IExceptionFilter exceptionFilter in registeredFilters.ExceptionFilters)
                filters.ExceptionFilters.Add(exceptionFilter);
                
            foreach (IResultFilter resultFilter in registeredFilters.ResultFilters)
                filters.ResultFilters.Add(resultFilter);

            return filters;
        }

        #endregion
    }
}
